//
//  YFWeiboStatusListViewModel.swift
//  YFSwiftWeibo
//
//  Created by tsaievan on 2017/8/28.
//  Copyright © 2017年 tsaievan. All rights reserved.
//

import Foundation
import SDWebImage

///< 定义一个全局变量为3, 如果超过3次, 就不再刷新
fileprivate let pullUpMaxTimes = 3

class YFWeiboStatusListViewModel {
    
    // 定义一个变量是上拉刷新次数的变量
    var pullUpTryTimes = 0
    lazy var statusList = [YFWeiboStatusViewModel]()
    func loadStatus(isPullUp: Bool, completion:@escaping (_ isSuccess: Bool, _ shouldRefresh : Bool)->()) {
        // 判断是否是上拉刷新, 同时检查刷新错误
        if isPullUp && pullUpTryTimes > pullUpMaxTimes {
            completion(true, false)
            return
        }
        
        // 第一条微博的id
        // 傻逼了, 不能sinceId和maxId两个参数同时传进去, 那样会得到一个空数组
        // 这里必须要进行一个判断, 如果是上拉刷新的话, sinceId就返回0, maxId返回值
        // 如果是下拉刷新的话,sinceId返回值, maxId返回0
        let sinceId = isPullUp ? 0 : statusList.first?.status.id
        // 最后一条微博的id
        let maxId = isPullUp ? statusList.last?.status.id : 0
        
        YFNetworkManager.shared.statusList(sinceId: sinceId ?? 0, maxId: maxId ?? 0) { (list, isSuccess) in
            
            ///< 0. 先判断网络是否加载成功
            if !isSuccess {
                completion(false, false)
                return
            }
            
            ///< 1. 字典转模型
            
            var arrayM = [YFWeiboStatusViewModel]()
            
            for dict in list ?? [] {
                ///< 这里加一个守护, 如果字典转模型不成功, 就继续循环, 转入下一个
                guard let model = YFWeiboStatus.yy_model(with: dict) else {
                    continue
                }
                arrayM.append(YFWeiboStatusViewModel(model: model))
            }
            
            print("刷新到\(arrayM.count)条数据 \(arrayM)")
            ///< 2. 拼接数据
            if isPullUp { // 如果是上拉刷新, 就把数据拼接在后面
                self.statusList += arrayM;
            }else { // 如果是下拉刷新, 就把数据拼接在最前面
                self.statusList = arrayM + self.statusList
            }
            
            ///< 3.判断上拉刷新的数据量(刷新数组的长度如果为0, 表示没有刷新到数据, 如果次数达到3次, 那么就不再刷新了)
            if isPullUp && arrayM.count == 0 {
                self.pullUpTryTimes += 1
                completion(isSuccess, false)
            }else {
                ///< 缓存单张图片
                self.cacheSinglePicModel(list: arrayM, finished: completion)
            }
        }
    }
}

extension YFWeiboStatusListViewModel {
    fileprivate func cacheSinglePicModel(list: [YFWeiboStatusViewModel], finished:@escaping (_ isSuccess: Bool, _ shouldRefresh : Bool)->()) {
        
        /// 初始化数据的长度
        var length = 0
        ///< 实例化调度组
        let group = DispatchGroup()
        
        for vm in list {
            if vm.picUrls?.count != 1 {
                continue
            }
            guard let urlString = vm.picUrls![0].thumbnail_pic,
                let url = URL(string: urlString) else {
                    continue
            }
            ///< 入组
            group.enter()
            
            SDWebImageManager.shared().imageDownloader?.downloadImage(with: url, options: [], progress: nil, completed: { (image, data, _, _) in
                
                if let data = data,
                    let image = image {
                    length += data.count
                    vm.calcImageSize(image: image)
                }
                ///< 出组
                group.leave()
            })
        }
        
        ///< 当任务都完成之后, 调度组发出通知, 然后在主线程完成回调
        group.notify(queue: DispatchQueue.main) {
            print("length的长度:\(length)")
            
            ///< 在这里完成闭包的回调
            finished(true, true)
        }
    }
}
